package com.tree.jobquartz.trigger;

import org.quartz.CronScheduleBuilder;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.springframework.stereotype.Component;

/**
 * @ClassName TriggerManager
 * @Description: 定时任务触发器管理器
 * @Author: myl
 * @create_time: 2020/10/23 11:22
 */
@Component
public class TriggerManager {

    /**
     * 回测定时任务中间间隔
     */
    private final int BACK_TEST_INTERVAL_IN_SECONDS = 1;

    /**
     * 因子计算定时任务中间间隔
     */
    private final int FACTOR_CAL_INTERVAL_IN_SECONDS = 3;

    /**
     * 获取回测触发器实例
     *
     * @param backTestId
     * @return
     */
    public Trigger getBackTestTriggerInstance(String backTestId, String requestId, String resultId, String uId) {
        Trigger trigger = TriggerBuilder.newTrigger()
            // 给当前JobDetail添加K-V参数，链式调用传入多个参数，在Job实现类中根据context上下文获取对应key值
            .usingJobData("backTestId", backTestId).usingJobData("uId", uId).usingJobData("requestId", requestId)
            .usingJobData("resultId", resultId)
            // 添加认证信息，有3种重写的方法，我这里是其中一种，可以查看源码看其余2种
            .withIdentity(backTestId).startNow().withSchedule(
                // 添加执行规则，SimpleTrigger、CronTrigger的区别主要就在这里
                SimpleScheduleBuilder.simpleSchedule()
                    // 每隔3s执行一次 TODO 将间隔参数封装到
                    .withIntervalInSeconds(BACK_TEST_INTERVAL_IN_SECONDS)
                    // 一直执行，直到被删除或者重复，如果不写只会执行一次
                    .repeatForever())
            .build();

        return trigger;
    }



}
